モデルの一括検証

概要

Next Design エクステンションを開発すれば、モデルの情報を入力に、任意の検証処理を実装して、エラー箇所を表示する機能を実現できます。

以下では、.NET DLL による実装方法で、モデル検証のための UI ボタンを追加して、そのボタンを押下すると全モデルを一括検証して、エラー箇所を表示するエクステンションを作成してみましょう。

  • 全体の流れ

    • .NET DLL 開発プロジェクトの準備
    • マニフェストによるエクステンションと拡張ポイントの定義
    • リボン UI 用アイコンファイルの追加
    • 全モデルの検証処理の実装

ゴールイメージ

モデル名の一括検証

  • Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開くと、リボンに [My Extensions] タブが追加され、エクステンションの機能が有効になります。

  • リボンから [My Extensions] > [モデル検証] > [検証] ボタンを押下すると、次の検証ルールに従って全モデルが一括検証されて、エラー箇所が表示されます。

    検証ルール: モデル名に半角スペース文字が含まていないこと

  • 表示されているエラーをクリアするには、リボンから [ホーム] > [モデル] > [エラーチェック] > [エラークリア] をクリックします。

ダウンロード

  • 次のリンクから本チュートリアルの結果として作成されるファイル一式をダウンロードできます。

    ダウンロードリンク: ValidationSample-1.zip

.NET DLL 開発プロジェクトの準備

Visual Studioで .NET DLL 開発プロジェクトを新規作成して、エクステンションのデバッグ環境を準備する手順を、次の順に説明します。

  • Visual Studio での新しいプロジェクトの作成
  • エクステンション開発用 DLL のコピー
  • エクステンション開発用 DLL の参照設定追加

ここでは、Visual Studio 2019 での操作手順を説明しますが、Visual Studio 2017 以降でも開発できます(以下、VS と記します)。

なお、以下の説明ではインストールフォルダがデフォルトとなっていることを前提としています。 異なる場合は、実際のインストールフォルダに置き換えてください。

デフォルトのインストールフォルダ: C:\Program Files (x86)\DENSO CREATE\Next Design

VS での新しいプロジェクトの作成

.NET DLL の開発プロジェクトを新規作成するには、次の手順で行います。

VS での新しいプロジェクトの作成

操作手順

  1. VS を起動し、スタートページから [新しいプロジェクトの作成] をクリックして、[新しいプロジェクトの作成] ウィザードを開きます。
  2. プロジェクトテンプレートから C# による [クラス ライブラリ (.NET Framework)] を選択して [次へ] ボタンを押下します。
  3. [新しいプロジェクトの構成] で、下記表の通り、項目を入力して [作成] ボタンを押下します。
  4. これにより、C# によるクラスライブラリ開発の VS プロジェクトのひな型が新規作成されます。
  5. ひな型として作成されたファイルのうち、Class1.cs ファイルは使用しません。VS のソリューションエクスプローラーから削除してください。
項目
プロジェクト名とソリューション名 ValidationSample
場所 プロジェクト一式を格納する任意の親フォルダ
フレームワーク .NET Framework 4.6.2

ノート

エクステンション開発用 DLL のコピー

Next Design エクステンション開発で利用する DLL をコピーするには、次の手順で行います。

エクステンション開発用 DLL のコピー

操作手順

  1. 次の DLL を Next Design のインストールフォルダから VS プロジェクト配下にコピーします。

    NextDesign.Core.dll
    NextDesign.Desktop.dll

エクステンション開発用 DLL の参照設定追加

コピーした DLL を VS プロジェクトの参照設定に追加するには、次の手順で行います。

エクステンション開発用 DLL の参照設定追加

操作手順

  1. VS のソリューションエクスプローラーから、次のノードを展開します。

    ソリューション [ValidationSample] > [ValidationSample] > 参照

  2. ツリー上の [参照] ノードを右クリックし、コンテキストメニューから [参照の追加] コマンドを実行して、[参照マネージャー] ダイアログを開きます。

  3. [参照マネージャー] ダイアログ右下の [参照] ボタンを押下して、[参照するファイルの選択] ダイアログを開きます。

  4. 先ほど VS プロジェクト配下にコピーした次の DLL ファイルを選択して [追加] ボタンを押下して、[参照マネージャー] ダイアログに戻ります。

    NextDesign.Core.dll
    NextDesign.Desktop.dll

  5. 追加した DLL ファイルが[参照マネージャー] ダイアログの一覧でチェックされていることを確認して、[OK] ボタンを押下します。

  6. これで、VS のソリューションエクスプローラーの [参照] ノードの下に、Next Design エクステンション開発に必要な DLL が追加されます。

デバッグ実行準備の自動化

DLLの実行とデバッグ」で説明されている DLL のデバッグ実行準備を自動化するには、次の手順で行います。

デバッグ実行準備の自動化

操作手順

  1. ソリューション [ValidationSample] > [ValidationSample] のプロパティを開き、次の設定項目に下記スクリプトをコピーして貼り付けます。

    設定項目: [ビルドイベント] > [ビルド後イベントのコマンドライン]

  2. 続けて、同プロパティで、[デバッグ] > [開始動作] > [外部プログラムの開始] に次のパスを設定します。

    C:\Program Files (x86)\DENSO CREATE\Next Design\NextDesign.exe

ビルド後イベントのコマンドライン

setlocal
set EXTENSIONS_FOLDER=%LOCALAPPDATA%\DENSO CREATE\Next Design\extensions
set DESTINATION_FOLDER=%EXTENSIONS_FOLDER%\$(ProjectName)

if not exist "%EXTENSIONS_FOLDER%" mkdir "%EXTENSIONS_FOLDER%"

del "$(TargetDir)NextDesign.Core.dll" "$(TargetDir)NextDesign.Desktop.dll" > NUL 2>&1
rd /S /Q "%DESTINATION_FOLDER%" > NUL 2>&1

echo Deploy extension into extensions sub folder: %DESTINATION_FOLDER%

xcopy /S /I /Q /Y "$(TargetDir)*.*" "%DESTINATION_FOLDER%"
xcopy /S /I /Q /Y "$(ProjectDir)resources" "%DESTINATION_FOLDER%\resources"
copy /Y "$(ProjectDir)*.json" "%DESTINATION_FOLDER%"

マニフェストによるエクステンションと拡張ポイントの定義

マニフェストを新規作成するには、VS プロジェクトに新しい項目としてテキストファイル: manifest.json を新規作成して、次の内容を定義します。

  • 実行プログラムのエントリーポイント定義
  • エクステンションのライフサイクル定義
  • エクステンションの対象プロファイル指定
  • UI の拡張ポイント定義(リボンタブ・グループ・ボタン)
  • コマンドの拡張ポイント定義

マニフェストファイルの新規作成

VS プロジェクトに新しい項目としてテキストファイル: manifest.json を新規作成するには、次の手順で行います。

マニフェストファイルの新規作成

操作手順

  1. VS のソリューションエクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [新しい項目] コマンドを実行します。
  2. 追加する項目の種類から [テキスト ファイル] を選択して、[名前] 入力フィールドに manifest.json を入力して [追加] ボタンを押下します。
  3. これにより、空の manifest.json ファイルが新規作成され、VS のソリューションエクスプローラーにも表示されます。

実装コード

manifest.json

{
  // エクステンション定義
  "name": "Validation Sample",
  "version": "1.1.0",
  "publisher": "DENSO CREATE INC.",
  "license": "Next Design 使用許諾契約書に準ずる。Copyright (C) 2019 DENSO CREATE INC. All rights reserved.",

  "main": "ValidationSample.dll",         // エントリーポイントとしてビルド結果の DLL ファイル名を指定します。
  "lifecycle": "project",                 // ライフサイクルとしてプロジェクトライフサイクルを指定します。
  "baseprofile": "車載システムソフト開発",  // 対象プロジェクトの条件としてプロファイル名を指定します。

  // 拡張ポイント定義
  "extensionPoints": {
    // リボン
    "ribbon": {
      "tabs": [
        // エクステンション用に追加するリボンタブを定義します。
        {
          "id": "MyExtensions.MainTab",
          "label": "My Extensions",
          "orderAfter": "System.Help",
          "groups": [
            // リボンタブ内を区切るグループを定義します。
            {
              "id": "MyExtensions.Validation.Group",
              "label": "モデル検証",
              "controls": [
                // 検証実行ボタンを定義します。
                {
                  "type": "Button",
                  "id": "MyExtensions.Validation.RunButton",
                  "label": "検証",
                  "description": "全モデルを検証します。",
                  "imageLarge": "resources/icon.png",
                  "command": "Command.Validation.Run"   // 後述のコマンドに定義される検証コマンドの id を指定します。
                }
              ]
            }
          ]
        }
      ]
    },

    // コマンド
    "commands": [
      // 検証処理のコマンドハンドラ `Run` を呼び出す検証コマンドを定義します。
      {
        "id": "Command.Validation.Run",
        "execFunc": "Run",            // エントリーポイントのメインクラスに実装される公開メソッドを指定します。
        "canExecWhen": {
          "uiState": "ProjectOpened"  // コマンドの有効条件としてプロジェクトが開いていることを指定します。
        }
      }
    ],

    // イベント
    "events": {
    }
  }
}

リボン UI 用アイコンファイルの追加

前述のマニフェストで検証実行ボタンの imageLarge に指定した UI ボタン用アイコンファイルを VS プロジェクトに追加するには、次の手順て行います。

リボン UI 用アイコンファイルの追加

操作手順

  1. VS プロジェクトの直下に resources サブフォルダを作成します。
  2. 作成したサブフォルダに icon.png ファイルを格納します。
    icon.png ファイルのサンプルは、概要に記載したダウンロードファイルに含まれています)
  3. VS のソリューションエクスプローラーにもアイコンファイルを登録したい場合は、resources サブフォルダをソリューションエクスプローラーの VS プロジェクトの上にドラッグ&ドロップします。
    (この操作は任意です。アイコンファイルを登録しなくても問題ありません)

Info

  • 大きいアイコンのサイズは 32 x 32 を、小さいアイコンのサイズは 16 x 16 を推奨します。

全モデルの検証処理の実装

エクステンションのエントリーポイントと検証処理を実装するには、VS プロジェクトに新しい項目としてクラス: ValidationSample を新規作成して、次の内容を実装します。

  • 参照するAPIの名前空間の宣言
  • エントリーポイントとなる DLL のメインクラス
  • 検証処理のコマンドハンドラ(公開メソッド)
  • エクステンションの初期化処理・終了処理

クラスの新規作成

VS プロジェクトに新しい項目としてクラス: ValidationSample を新規作成するには、次の手順で行います。

クラスの新規作成

操作手順

  1. VS のソリューションエクスプローラーから VS プロジェクトを右クリックして、コンテキストメニューの [追加] > [クラス] コマンドを実行します。
  2. 追加する項目の種類で [クラス] を選択されていることを確認して、[名前] 入力フィールドに ValidationSample を入力して [追加] ボタンを押下します。
  3. これにより、ValidationSample.cs ファイルのひな型が新規作成され、VS のソリューションエクスプローラーにも表示されます。

実装コード

ValidationSample.cs

// エクステンション開発で参照するAPIの名前空間の宣言
using NextDesign.Extension;
using NextDesign.Core;
using NextDesign.Desktop;

/// <summary>
/// エントリーポイントとなるDLLのメインクラス
/// </summary>
/// <remarks>
/// エントリーポイントのメインクラスには、 `IExtension` インタフェースを実装します。
/// ハンドラはこのクラスの公開メソッドとして実装します。
/// </remarks>
public class ValidationSample : IExtension
{
    /// <summary>
    /// 検証処理のコマンドハンドラ
    /// </summary>
    /// <param name="context">コマンドコンテキスト</param>
    /// <param name="parameters">コマンドパラメータ</param>
    /// <remarks>
    /// 検証処理のコマンドハンドラをメインクラスの公開メソッドとして実装します。
    /// </remarks>
    public void Run(ICommandContext context, ICommandParams parameters)
    {
        var app = context.App;
        var project = app.Workspace.CurrentProject;

        // 以前のエラーをすべてクリアします。
        app.Errors.ClearErrors();

        // エラー一覧ウィンドウを表示します。
        app.Window.IsInformationPaneVisible = true;
        app.Window.ActiveInfoWindow = "Error";

        // プロジェクト中のすべてのモデルを対象に繰り返し処理を行います。
        var models = project.GetAllChildren();
        foreach (var model in models)
        {
            // 検証ルールに従ってモデルを検証します。
            ValidateModel(model);
        }
    }

    /// <summary>
    /// 検証ルールに従ってモデルを検証
    /// </summary>
    /// <param name="model">モデル</param>
    private void ValidateModel(IModel model)
    {
        // 次の検証ルールと照合します。
        // ・モデル名には半角スペースを含めないこと
        if (model.Name.IndexOf(" ") > 0)
        {
            // 検証ルールに合わない場合は、該当モデルにエラー情報を追加します。
            var message = string.Format("モデル名に半角スペースが含まれています。モデル名: {0}", model.Name);
            var error = model.AddError("Name", "Error", "モデル命名規則チェック", message);
        }
    }

    /// <summary>
    /// エクステンションの初期化処理
    /// </summary>
    /// <param name="context">実行コンテキスト</param>
    /// <remarks>
    /// エクステンションの初期化処理・終了処理が不要な場合も、空の `Activate`, `Deactivate` メソッドが必要です。
    /// </remarks>
    public void Activate(IContext context)
    {
        // 必要に応じてエクステンションの初期化処理などを実装します。
    }

    /// <summary>
    /// エクステンションの終了処理
    /// </summary>
    /// <param name="context">実行コンテキスト</param>
    /// <remarks>
    /// エクステンションの初期化処理・終了処理が不要な場合も、空の `Activate`, `Deactivate` メソッドが必要です。
    /// </remarks>
    public void Deactivate(IContext context)
    {
        // 必要に応じてエクステンションの終了処理などを実装します。
    }
}